<?php
/**
* 名称：数据库操作类。
* 描述：基于"类库EPDO对象"原理和本应用的"数据库配置"，构建的数据库操作桥接对象。
*/
final class Database{
    /**
    * 描述：最后一次操作标识符。
    */
    const DISPOSE='TRYPHP_DATABASE_DISPOSE';

    /**
    * 描述：EPDO对象存放标量，单元素模式的，有就不在创建PDO对象。
    */
    private static $DB=NULL;

    /**
    * 描述：“调用请求”嫁接函数，将"调用请求"转嫁到EPDO对象上，实际使用的是EPDO对象。
    * @param  string $name      调用的方法名称。
    * @param  array  $arguments 调用方法给出的所有参数。
    * @return mix
    */
    public static function __CallStatic($name,$arguments){
        #检测是否己经创建了数据库操作对象，如果没创建就创建一个。
        if(!self::$DB){
            $configFilePath=APP_ROOT.'/_config/database.php';
            if(!file_exists($configFilePath)){
                Error::Cast(sprintf('找不到数据库配置文件，路径是：%s。',$configFilePath));
            }
            self::$DB=new EPDO(include($configFilePath));
        }
        #执行"调用请求"，并检测"请求"是不是给了"最一次操作"的标识,给出了就释放该对象。
        $isDispose=FALSE;
        if(end($arguments)===Database::DISPOSE){
            $isDispose=TRUE;
            array_pop($arguments);
        }
        #检调方法。
        if(!method_exists(self::$DB,$name)){
            Error::Cast(sprintf('数据库操作类没有该方法，方法名是：%s。',$name));
        }
        $value=call_user_func_array(array(self::$DB,$name),$arguments);
        #如果是最后一次请求，则释放该对象。
        if($isDispose===TRUE){
            self::$DB=NULL;
        }
        return $value;
    }

    /**
    * 描述：根据配置文件切换数据库连接。
    * @param  string $configFilePath 数据库配置文件。
    * @return void
    */
    public static function Renewal($configFilePath){
        if(file_exists($configFilePath)){
            self::$DB=new EPDO(include($configFilePath));
        }
        else{
            Error::Cast(sprintf('找不到数据库配置文件，路径是：%s。',$configFilePath));
        }
    }
}
?>